package com.xul.crowd.controller;

import com.xul.crowd.entity.Menu;
import com.xul.crowd.service.MenuService;
import com.xul.crowd.util.ResultEntity;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;

/**
 * @author xul
 * @create 2021-07-24 20:53
 */

@Controller
public class MenuController {

    @Autowired
    private MenuService menuService;

    /**
     * 删除菜单维护
     * @param id
     * @return
     */
    @ResponseBody
    @RequestMapping("menu/remove.json")
    public ResultEntity<String> removeMenu(@RequestParam Integer id) {

        menuService.removeMenu(id);
        return ResultEntity.successWithData();
    }


    /**
     * 修改菜单维护
     *
     * @param menu
     * @return
     */
    @ResponseBody
    @RequestMapping("menu/update.json")
    public ResultEntity<String> updateMenu(Menu menu) {
        menuService.updateMenu(menu);
        return ResultEntity.successWithData();
    }

    /**
     * 给菜单维护添加叶子节点
     *
     * @param menu
     * @return
     */
    @ResponseBody
    @RequestMapping("menu/save.json")
    public ResultEntity<String> saveMenu(Menu menu) {
        menuService.saveMenu(menu);
        return ResultEntity.successWithData();
    }

    /**
     * 将子节点封装的父节点
     *
     * @return
     */
    @ResponseBody
    @RequestMapping("menu/get/whole/tree.json")
    public ResultEntity<Menu> getWholeTreeNew() {
        // 1.查询全部的Menu对象
        List<Menu> menuList = menuService.getAll();
        // 2.声明一个变量来存储找到的根节点
        Menu menuRoot = null;
        // 3.创建Map对象用来存储id和Menu对象的对应关系便于查找父节点
        Map<Integer, Menu> menuMap = new HashMap<>();
        // 4.遍历menuList填充menuMap
        for (Menu menu : menuList) {
            Integer id = menu.getId();
            menuMap.put(id, menu);
        }
        // 5.再次遍历menuList查找根节点 组装父子节点
        for (Menu menu : menuList) {
            // 6.获取当前menu对象的pid的属性值
            Integer pid = menu.getPid();
            // 7.如果pid为null 判定为根节点
            if (pid == null) {
                menuRoot = menu;
                // 8.如果当前节点是根节点 那么肯定没有父节点 不必继续执行
                continue;
            }
            // 9.如果pid不为null 说明当前节点有父节点 那么可以根据pid到menuMap中查找对应的Menu对象
            Menu father = menuMap.get(pid);
            // 10.将当前节点存入父节点的children集合
            father.getChildren().add(menu);
        }
        // 11.经过上面的运算 根节点包含了整个树形结构 返回根节点就是返回整个树
        return ResultEntity.successWithData(menuRoot);
    }

    /**
     * 两次循环 将子节点封装的父节点(弃用 )
     *
     * @return
     */
    public ResultEntity<Menu> getWholeTreeNewOld() {

        // 1.查询全部的Menu对象
        List<Menu> menuList = menuService.getAll();
        // 2.声明一个变量来存储找到的根节点
        Menu menuRoot = null;
        // 3.遍历menuList
        for (Menu menu : menuList) {
            // 4.获取到当前的pid属性值
            Integer pid = menu.getPid();
            // 5.检查pid是否为空
            if (pid == null) {
                // 6.把当前正在遍历的menu对象赋值给menuRoot 即没有根节点了
                menuRoot = menu;
                // 7.停止本次循环,执行下一次循环
                continue;
            }
            // 8.如果pid不为null 说明当前节点有父节点 找到父节点就可以经行组装 建立父子关系
            for (Menu fatherMenu : menuList) {
                // 9.获取到fatherMenu的属性值
                Integer id = fatherMenu.getId();
                // 10.将字节的的pid和疑似父节点的id经行比较
                if (Objects.equals(pid, id)) {
                    // 11.将子节点存入到父节点的children集合
                    fatherMenu.getChildren().add(menu);
                    // 12.找到即可停止循环
                    break;
                }
            }
        }
        return ResultEntity.successWithData(menuRoot);
    }
}
